﻿class pw.archipelag.loaderGame.configVars.Net extends Object {
	private var pauzaSprawdzajCzyWStanieWysylaniaPobieraniaDanychZSerwera:Function;	
	private var intervalSprawdzajCzyWStanieWysylaniaPobieraniaDanychZSerwera:Number;
	private var czyWStanieWysylaniaPobieraniaDanychZSerwera:Boolean;	
	private var funkcjaDoWykonaniaTab:Array;
	private var inicjujPobraneDaneZSerwera:Function;
	private var daneZSerweraXML:XML;	
	
	function Net() {}
	
	//dodatkowa funkcjonalnoæ XML - zwraca tablice dzieci wêz³a "node" o nazwie "childName"
	public function getChildrenByName(node, childName) {
		var childrenArray = new Array();
		if (node.hasChildNodes()) {
			for (var i = 0; i<node.childNodes.length; i++) {
				if (node.childNodes[i].nodeName == childName) {
					childrenArray.push(node.childNodes[i]);
				}
			}
		}
		return childrenArray;
	};
	
	public function wczytajXML(nazwaPlikuXML, funkcjaDoWykonania, kontekstFunkcji, parametryFunkcji, isSpecialOperation) {
		var obiektXML = new XML();
		obiektXML.classNet = this;
		obiektXML.funkcjaDoWykonania = funkcjaDoWykonania;
		obiektXML.kontekstFunkcji = kontekstFunkcji;
		obiektXML.parametryFunkcji = parametryFunkcji;
		obiektXML.isSpecialOperation = isSpecialOperation;
		obiektXML.ignoreWhite = true;
		
		/*
		obiektXML.onLoad = function(czyWczytanoXML) {
			if (this.czyWStaniePobieraniaXML) {
				clearInterval(this.intervalSprawdzajCzyWStaniePobieraniaXML);
				this.czyWStaniePobieraniaXML = false;
				this.funkcjaDoWykonania.apply(this.kontekstFunkcji, new Array(czyWczytanoXML).concat(this.parametryFunkcji));
			}
		};
		*/
		obiektXML.onData = function(daneZSerweraString) {
			var daneZSerweraXML = new _global.XML(daneZSerweraString);
			if (this.czyWStaniePobieraniaXML) {
				clearInterval(this.intervalSprawdzajCzyWStaniePobieraniaXML);
				this.czyWStaniePobieraniaXML = false;
				var childNum = daneZSerweraXML.childNodes.length - 1;
				this.trimWhiteSpaces = function(str) {
				    var stripCharCodes = {
				        code_9  : true, // tab
				        code_10 : true, // linefeed
				        code_13 : true, // return
				        code_32 : true  // space
				    };
				    while(stripCharCodes["code_" + str.charCodeAt(0)] == true) {
				        str = str.substring(1, str.length);
				    }
				    while(stripCharCodes["code_" + str.charCodeAt(str.length - 1)] == true) {
				        str = str.substring(0, str.length - 1);
				    }
				    return str;
				}				
				while (((daneZSerweraXML.childNodes[childNum] == undefined) || (this.trimWhiteSpaces(String(daneZSerweraXML.childNodes[childNum])) == "")) && (childNum > 0)) {
					childNum--;
				}
				this.funkcjaDoWykonania.apply(this.kontekstFunkcji, new Array(daneZSerweraXML.childNodes[childNum]).concat(this.parametryFunkcji));
			}
		};
		//sprawdzanie timeout
		obiektXML.pauzaSprawdzajCzyWStaniePobieraniaXML = function(obiektXML) {
			if (obiektXML.czyWStaniePobieraniaXML) {
				clearInterval(obiektXML.intervalSprawdzajCzyWStaniePobieraniaXML);
				obiektXML.intervalSprawdzajCzyWStaniePobieraniaXML = false;
				obiektXML.funkcjaDoWykonania.apply(obiektXML.kontekstFunkcji, new Array(false).concat(this.parametryFunkcji));
			}
		}
		obiektXML.czyWStaniePobieraniaXML = true;
		clearInterval(obiektXML.intervalSprawdzajCzyWStaniePobieraniaXML)
		obiektXML.intervalSprawdzajCzyWStaniePobieraniaXML = setInterval(obiektXML.pauzaSprawdzajCzyWStaniePobieraniaXML, 30000, obiektXML);
		obiektXML.load(nazwaPlikuXML);
		return obiektXML;
	};
	
	private function definiujTimeoutDlaOperacjiSieciowych(funkcjaDoWykonaniaTab, czasTimeout) {
		if ((czasTimeout == undefined) || (czasTimeout == null)) {
			czasTimeout = 30000;
		}
		this.pauzaSprawdzajCzyWStanieWysylaniaPobieraniaDanychZSerwera = function(klasaZadanie, funkcjaDoWykonaniaTab) {
			if (klasaZadanie.czyWStanieWysylaniaPobieraniaDanychZSerwera) {
				clearInterval(klasaZadanie.intervalSprawdzajCzyWStanieWysylaniaPobieraniaDanychZSerwera);
				klasaZadanie.czyWStanieWysylaniaPobieraniaDanychZSerwera = false;
				funkcjaDoWykonaniaTab[0].apply(funkcjaDoWykonaniaTab[1], new Array(false).concat(funkcjaDoWykonaniaTab[2]));
			}
		}
		this.czyWStanieWysylaniaPobieraniaDanychZSerwera = true;
		this.intervalSprawdzajCzyWStanieWysylaniaPobieraniaDanychZSerwera = setInterval(this.pauzaSprawdzajCzyWStanieWysylaniaPobieraniaDanychZSerwera, czasTimeout, this, funkcjaDoWykonaniaTab);
	}
	
	private function budujStringGETDlaParametrowZTablicy(sciezkaMetodySerwera, tabParamGET) {
		var strWyslijPobierzDaneZSerwera = sciezkaMetodySerwera;
		for (var i = 0; i < tabParamGET.length; i++) {
			if (strWyslijPobierzDaneZSerwera.indexOf("?") != -1) {
				strWyslijPobierzDaneZSerwera += "&";
			} else {
				strWyslijPobierzDaneZSerwera += new Array("?", "&")[Number(i > 0)];
			}
			strWyslijPobierzDaneZSerwera += tabParamGET[i][0] + "=" + String(tabParamGET[i][1]);
		}
		return strWyslijPobierzDaneZSerwera;
	}
	
	public function wyslijDaneNaSerwer(sciezkaMetodySerwera, tabParamGET, tabParamPOST, funkcjaDoWykonaniaTab, czasTimeout) {
		this.definiujTimeoutDlaOperacjiSieciowych(funkcjaDoWykonaniaTab, czasTimeout);
		var objWyslijDaneNaSerwer = new LoadVars();
		objWyslijDaneNaSerwer.klasaZadanie = this;
		objWyslijDaneNaSerwer.funkcjaDoWykonaniaTab = funkcjaDoWykonaniaTab;
		var lvWyslijDaneNaSerwer = new LoadVars();
		for (var i = 0; i < tabParamPOST.length; i++) {
			lvWyslijDaneNaSerwer[tabParamPOST[i][0]] = String(tabParamPOST[i][1]);
		}
		var strWyslijDaneNaSerwer = this.budujStringGETDlaParametrowZTablicy(sciezkaMetodySerwera, tabParamGET);
		//trace("strWyslijDaneNaSerwer:"+strWyslijDaneNaSerwer)
		lvWyslijDaneNaSerwer.isSpecialOperation = true;
		lvWyslijDaneNaSerwer.sendAndLoad(strWyslijDaneNaSerwer, objWyslijDaneNaSerwer, "POST");
		objWyslijDaneNaSerwer.onLoad = function(success) {
			if (this.klasaZadanie.czyWStanieWysylaniaPobieraniaDanychZSerwera) {
				clearInterval(this.klasaZadanie.intervalSprawdzajCzyWStanieWysylaniaPobieraniaDanychZSerwera);
				this.klasaZadanie.czyWStanieWysylaniaPobieraniaDanychZSerwera = false;
				this.funkcjaDoWykonaniaTab[0].apply(this.funkcjaDoWykonaniaTab[1], new Array(success, this).concat(this.funkcjaDoWykonaniaTab[2]));
			}
		}
	}
	
	//umo¿liwia wywo³ywanie zwrotnych funkcji dla ka¿dej z wielu jednoczesnych operacji sieciowych
	public function wyslijDaneNaSerwerWKonteksciLokalnym(sciezkaMetodySerwera, tabParamGET, tabParamPOST, funkcjaDoWykonaniaTab, czasTimeout) {
		var objectWyslijDaneMaSerwer = new Object();
		objectWyslijDaneMaSerwer.wyslijDaneNaSerwer = this.wyslijDaneNaSerwer;
		objectWyslijDaneMaSerwer.budujStringGETDlaParametrowZTablicy = this.budujStringGETDlaParametrowZTablicy;
		objectWyslijDaneMaSerwer.definiujTimeoutDlaOperacjiSieciowych = this.definiujTimeoutDlaOperacjiSieciowych;
		objectWyslijDaneMaSerwer.wyslijDaneNaSerwer(sciezkaMetodySerwera, tabParamGET, tabParamPOST, funkcjaDoWykonaniaTab, czasTimeout);
		return objectWyslijDaneMaSerwer;
	}
	
	public function pobierzDaneZSerwera(sciezkaMetodySerwera, tabParamGET, funkcjaDoWykonaniaTab, czasTimeout, czyDodawacWartoscLosowa, isSpecialOperation) {
		if (czyDodawacWartoscLosowa == undefined) {
			czyDodawacWartoscLosowa = false;
		}
		this.definiujTimeoutDlaOperacjiSieciowych(funkcjaDoWykonaniaTab, czasTimeout);
		this.funkcjaDoWykonaniaTab = funkcjaDoWykonaniaTab;
		
		/*
		this.inicjujPobraneDaneZSerwera = function(success) {
			if (this.czyWStanieWysylaniaPobieraniaDanychZSerwera) {
				clearInterval(this.intervalSprawdzajCzyWStanieWysylaniaPobieraniaDanychZSerwera);
				this.czyWStanieWysylaniaPobieraniaDanychZSerwera = false;
				var daneZSerweraNode = null;
				if (success) {
					daneZSerweraNode = this.daneZSerweraXML.childNodes[0];
				}
				this.funkcjaDoWykonaniaTab[0].apply(this.funkcjaDoWykonaniaTab[1], new Array(success, daneZSerweraNode).concat(this.funkcjaDoWykonaniaTab[2]));	
			}
		}
		*/
		this.inicjujPobraneDaneZSerwera = function(daneZSerweraNode) {
			if (this.czyWStanieWysylaniaPobieraniaDanychZSerwera) {
				clearInterval(this.intervalSprawdzajCzyWStanieWysylaniaPobieraniaDanychZSerwera);
				this.czyWStanieWysylaniaPobieraniaDanychZSerwera = false;
				var success = ((daneZSerweraNode != undefined) && (daneZSerweraNode != null) && (daneZSerweraNode != ""));
				this.funkcjaDoWykonaniaTab[0].apply(this.funkcjaDoWykonaniaTab[1], new Array(success, daneZSerweraNode).concat(this.funkcjaDoWykonaniaTab[2]));
			}
		}
		var strPobierzDaneZSerwera = this.budujStringGETDlaParametrowZTablicy(sciezkaMetodySerwera, tabParamGET);
		//trace("strPobierzDaneZSerwera:"+strPobierzDaneZSerwera)
		delete this.daneZSerweraXML;
		this.daneZSerweraXML = this.wczytajXML(strPobierzDaneZSerwera + ["", "&losowa=" + random(10000000)][Number(czyDodawacWartoscLosowa)], this.inicjujPobraneDaneZSerwera, this, [], isSpecialOperation);
	}
	
	//umo¿liwia wywo³ywanie zwrotnych funkcji dla ka¿dej z wielu jednoczesnych operacji sieciowych
	public function pobierzDaneZSerweraWKontekscieLokalnym(sciezkaMetodySerwera, tabParamGET, funkcjaDoWykonaniaTab, czasTimeout, czyDodawacWartoscLosowa, isSpecialOperation) {
		var objectPobierzDaneZSerwera = new Object();
		objectPobierzDaneZSerwera.pobierzDaneZSerwera = this.pobierzDaneZSerwera;
		objectPobierzDaneZSerwera.wczytajXML = this.wczytajXML;
		objectPobierzDaneZSerwera.wyslijDaneNaSerwer = this.wyslijDaneNaSerwer;
		objectPobierzDaneZSerwera.budujStringGETDlaParametrowZTablicy = this.budujStringGETDlaParametrowZTablicy;
		objectPobierzDaneZSerwera.definiujTimeoutDlaOperacjiSieciowych = this.definiujTimeoutDlaOperacjiSieciowych;
		objectPobierzDaneZSerwera.pobierzDaneZSerwera(sciezkaMetodySerwera, tabParamGET, funkcjaDoWykonaniaTab, czasTimeout, czyDodawacWartoscLosowa, isSpecialOperation);
	}
	
	public function generujLosoweHaslo(ileZnakow) {
		var numerZnaku;
		var strHaslo = "";
		for (var i = 0; i < ileZnakow; i++) {
			do {
				numerZnaku = random(255);
			} while (!(((numerZnaku >= 65) && (numerZnaku <= 90)) || ((numerZnaku >= 48) && (numerZnaku <= 57)) || ((numerZnaku >= 97) && (numerZnaku <= 122))));
			strHaslo += String.fromCharCode(numerZnaku);
		}
		return strHaslo;
	}

}